﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DataChangeTools.Utils
{
    public class DispatcherHelper
    {
        /// <summary>
        /// 在 UI 线程上执行操作。
        /// </summary>
        /// <param name="action">需要在 UI 线程上执行的操作。</param>
        public static void RunOnUIThread(Action action)
        {
            if  (System.Windows.Application.Current != null)
            {
                if (System.Windows.Application.Current.Dispatcher.CheckAccess())
                {
                    // 如果当前线程是 UI 线程，直接执行操作
                    action();
                }
                else
                {
                    // 如果当前线程不是 UI 线程，使用 Dispatcher.Invoke 切换到 UI 线程
                    System.Windows.Application.Current.Dispatcher.Invoke(action);
                }
            }
            else
            {
                throw new InvalidOperationException("Application.Current 为 null，请确保在 WPF 应用程序中调用此方法。");
            }
        }

        /// <summary>
        /// 在 UI 线程上异步执行操作。
        /// </summary>
        /// <param name="action">需要在 UI 线程上执行的操作。</param>
        public static async Task RunOnUIThreadAsync(Action action)
        {
            if (System.Windows.Application.Current == null)
            {
                throw new InvalidOperationException("Application.Current 为 null，请确保在 WPF 应用程序中调用此方法。");
            }

            if (System.Windows.Application.Current.Dispatcher.CheckAccess())
            {
                // 如果当前线程是 UI 线程，直接执行操作
                action();
            }
            else
            {
                // 如果当前线程不是 UI 线程，使用 Dispatcher.InvokeAsync 切换到 UI 线程
                await System.Windows.Application.Current.Dispatcher.InvokeAsync(action);
            }
        }
    }
}
